From cf470f31ca5562413502201381f2dfee48ddec71 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Fri, 9 Dec 2016 05:53:04 +0100 Subject: [PATCH] vulkan: Push the correct matrix when drawing Instead of pushing the root matrix, push the world matrix for the current node. That way, the bounds we emit as vertices are actually properly transformed. --- gsk/gskvulkanrender.c | 9 +-------- gsk/gskvulkanrenderpass.c | 22 ++++++++++++++++++---- gsk/gskvulkanrenderpassprivate.h | 1 + 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/gsk/gskvulkanrender.c b/gsk/gskvulkanrender.c index 626f6389cc..12b390d195 100644 --- a/gsk/gskvulkanrender.c +++ b/gsk/gskvulkanrender.c @@ -437,16 +437,9 @@ gsk_vulkan_render_draw (GskVulkanRender *self, }, (VkDeviceSize[1]) { 0 }); - vkCmdPushConstants (self->command_buffer, - gsk_vulkan_pipeline_get_pipeline_layout (self->pipeline), - VK_SHADER_STAGE_VERTEX_BIT, - 0, - sizeof (graphene_matrix_t), - &self->mvp); - for (l = self->render_passes; l; l = l->next) { - gsk_vulkan_render_pass_draw (l->data, self, self->pipeline, self->command_buffer); + gsk_vulkan_render_pass_draw (l->data, self, &self->mvp, self->pipeline, self->command_buffer); } vkCmdEndRenderPass (self->command_buffer); diff --git a/gsk/gskvulkanrenderpass.c b/gsk/gskvulkanrenderpass.c index 60deaccf58..d9582ca580 100644 --- a/gsk/gskvulkanrenderpass.c +++ b/gsk/gskvulkanrenderpass.c @@ -211,12 +211,15 @@ gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulkanRenderPass *self, } void -gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self, - GskVulkanRender *render, - GskVulkanPipeline *pipeline, - VkCommandBuffer command_buffer) +gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self, + GskVulkanRender *render, + const graphene_matrix_t *root_mvp, + GskVulkanPipeline *pipeline, + VkCommandBuffer command_buffer) { GskVulkanRenderOp *op; + graphene_matrix_t world, mvp; + float float_matrix[16]; guint i; for (i = 0; i < self->render_ops->len; i++) @@ -234,6 +237,17 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self, 0, NULL); + gsk_render_node_get_world_matrix (op->node, &world); + graphene_matrix_multiply (&world, root_mvp, &mvp); + graphene_matrix_to_float (&mvp, float_matrix); + + vkCmdPushConstants (command_buffer, + gsk_vulkan_pipeline_get_pipeline_layout (pipeline), + VK_SHADER_STAGE_VERTEX_BIT, + 0, + sizeof (float_matrix), + &float_matrix); + vkCmdDraw (command_buffer, op->vertex_count, 1, op->vertex_offset, 0); diff --git a/gsk/gskvulkanrenderpassprivate.h b/gsk/gskvulkanrenderpassprivate.h index a5eae7715c..1cc826d588 100644 --- a/gsk/gskvulkanrenderpassprivate.h +++ b/gsk/gskvulkanrenderpassprivate.h @@ -31,6 +31,7 @@ void gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulk GskVulkanRender *render); void gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self, GskVulkanRender *render, + const graphene_matrix_t*root_mvp, GskVulkanPipeline *pipeline, VkCommandBuffer command_buffer); -- 2.30.2